package com.jacob.androidframe.base;

import com.jacob.androidframe.controls.AsyncTask;

public abstract class AsyncTaskBase<Params, Progress, Result> extends AsyncTask<Params, Progress, Result>
{

	protected static final int	RESULT_OK		= 1;
	protected static final int	RESULT_FAIL		= -1;
	protected static final int	RESULT_CUSTOM	= 100;

	/**
	 * 在UI Thread中调用{@link #execute}方法后，UI Thread会先调用本方法。
	 * 然后才会由后台线程执行{@link #doInBackground(Object...)}方法。
	 * 本方法中可以操作UI，所以可以在本方法中做一些准备工作，如在界面上显示一个进度条。
	 * 
	 * @see #onPostExecute(Object)
	 * @see #doInBackground(Object...)
	 */
	@Override
	protected void onPreExecute()
	{
	}

	/**
	 * UI Thread调用{@link #onPreExecute()}方法后，后台线程调用本方法。
	 * 本方法的参数是由UI Thread中调用的{@link #execute}方法传过来的。
	 * 本方法中不可以操作UI。
	 * 这里主要负责执行那些比较耗时的后台计算工作。本方法体中可以调用{@link #publishProgress(Object...)}方法来更新实时的任务进度。
	 * 本方法是抽象方法，子类必须实现。
	 * 
	 * @param params
	 *            The parameters of the task.
	 * @return A result, defined by the subclass of this task.
	 * @see #onPreExecute()
	 * @see #onPostExecute(Object)
	 * @see #publishProgress(Object...)
	 */
	@Override
	protected abstract Result doInBackground(Params... params);

	/**
	 * 在{@link #publishProgress(Object...)}方法被调用后，UI thread将调用本方法。
	 * 本方法的参数就是调用{@link #publishProgress(Object...)}方法时传入的。
	 * 本方法中可以操作UI，所以可以在界面上展示任务的进展情况，例如更新一个进度条的进度。
	 * 
	 * @param values
	 *            The values indicating progress.
	 * @see #publishProgress
	 * @see #doInBackground
	 */
	@Override
	protected void onProgressUpdate(Progress... values)
	{
	}

	/**
	 * 在{@link #doInBackground(Object...)}方法执行完成后，UI thread会调用本方法。
	 * 本方法的参数是{@link #doInBackground(Object...)}方法的返回值。
	 * 若后台任务被UI thread取消，本方法将不会被调用。
	 * 本方法中可以操作UI。
	 * 
	 * @param result
	 *            The result of the operation computed by {@link #doInBackground}.
	 * @see #onPreExecute
	 * @see #doInBackground
	 * @see #onCancelled(Object)
	 */
	@Override
	protected void onPostExecute(Result result)
	{
	}

	/**
	 * <p>
	 * Runs on the UI thread after {@link #cancel(boolean)} is invoked and {@link #doInBackground(Object[])} has finished.
	 * </p>
	 * <p>
	 * The default implementation simply invokes {@link #onCancelled()} and ignores the result. If you write your own implementation, do not call <code>super.onCancelled(result)</code>.
	 * </p>
	 * 
	 * @param result
	 *            The result, if any, computed in {@link #doInBackground(Object[])}, can be null
	 * @see #cancel(boolean)
	 * @see #isCancelled()
	 */
	@Override
	protected void onCancelled(Result result)
	{
		onCancelled();
	}

	/**
	 * <p>
	 * Applications should preferably override {@link #onCancelled(Object)}. This method is invoked by the default implementation of {@link #onCancelled(Object)}.
	 * </p>
	 * <p>
	 * Runs on the UI thread after {@link #cancel(boolean)} is invoked and {@link #doInBackground(Object[])} has finished.
	 * </p>
	 * 
	 * @see #onCancelled(Object)
	 * @see #cancel(boolean)
	 * @see #isCancelled()
	 */
	@Override
	protected void onCancelled()
	{
	}

}
